package com.cloud.code.线程池;

import lombok.SneakyThrows;

/**
 * corePoolSize 核心线程数量
 * <p>
 * 即使没有任务执行，核心线程也会一直存活
 * 线程数小于核心线程时，即使有空闲线程，线程沲也会创建新线程执行任务
 * 设置allowCoreThreadTimeout=true时，核心线程会超时关闭
 * <p>
 * maximumPoolSize 最大线程数
 * <p>
 * 当所有核心线程都在执行任务，且任务队列已满时，线程沲会创建新线程执行任务
 * 当线程数=maxPoolSize,且任务队列已满，此时添加任务时会触发RejectedExecutionHandler进行处理
 * <p>
 * keepAliveTime TimeUnit 线程空闲时间
 * <p>
 * 如果线程数>corePoolSize，且有线程空闲时间达到keepAliveTime时，线程会销毁，直到线程数量=corePoolSize
 * 如果设置allowCoreThreadTimeout=true时，核心线程执行完任务也会销毁直到数量=0
 * <p>
 * workQueue 任务队列
 * <p>
 * ArrayBlockingQueue 有界队列，需要指定队列大小
 * LinkedBlockingQueue 若指定大小则和ArrayBlockingQueue类似，若不指定大小则默认能存储Integer.MAX_VALUE个任务，相当于无界队列，此时maximumPoolSize值其实是无意义的
 * SynchronousQueue 同步阻塞队列，当有任务添加进来后，必须有线程从队列中取出，当前线程才会被释放，newCachedThreadPool就使用这种队列
 */

public class Test {

    public static void main(String[] args) {

        ThreadPoolExecuter threadPoolExecuter = new ThreadPoolExecuter();
        for (int i = 0; i < 100; i++) {
            System.out.println(threadPoolExecuter);
            threadPoolExecuter.executor(new Runnable() {
                @SneakyThrows
                @Override
                public void run() {
                    Thread.sleep(3000);
                    System.out.println(Thread.currentThread().getName());
                }
            });
        }

        threadPoolExecuter.shutdown();

    }
}
